var SSRIWatcher = {

    preferences:null,
    utente:null,
    forumList:null,
    timerRepeat:null,
    timerLaunch:null,
    timerDisplay:null,
    startup: function() {
        start_venkman();

        SSRIWatcher.preferences = Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefService)
                .getBranch("extensions.ssriwatcher.");

        var launchEvent = {
            notify: function(timer) {
                SSRIWatcher.loadDOM();
            }
        };
        var checkEvent = {
            observe: function(subject, topic, data) {
                SSRIWatcher.refreshInformation();
            }
        };

        //TODO: modificate le preferenze bisognerebbe interrompere il timer e farlo ripartire con il valore aggiornato
        var frequency;
        if (SSRIWatcher.preferences.prefHasUserValue("frequency")) {
            frequency = SSRIWatcher.preferences.getIntPref("frequency");
        } else {
            frequency = 5;
        }
        /*SSRIWatcher.timerRepeat = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
         const TYPE_REPEATING_PRECISE = Components.interfaces.nsITimer.TYPE_REPEATING_PRECISE;
         SSRIWatcher.timerRepeat.init(checkEvent, frequency * 60 * 1000, TYPE_REPEATING_PRECISE);
         */
        // avvia la prima chiamata dopo 5 secondi
        SSRIWatcher.timerLaunch = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
        SSRIWatcher.timerLaunch.initWithCallback(launchEvent, 10 * 1000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
    },
    loadDOM:function() {
        debugger;
        SSRIWatcher.updateImage("waiting.png");
        var loadUtenteEvent = {
            notify:function() {
                debugger;
                SSRIWatcher.forumList = new ElencoForum(SSRIWatcher.utente, loadElencoForumEvent);
            }
        };
        var loadElencoForumEvent = {
            notify:function() {
                if (SSRIWatcher.utente.isOnline()) {
                    debugger;
                    SSRIWatcher.createMenu();
                    var elenco = SSRIWatcher.getSelectedForum();
                    for (var i = 0; i < elenco.length; i++) {
                        elenco[i].prepare(loadUnReadMessages);
                    }
                }
            }
        };
        var loadUnReadMessages = {
            notify:function() {
                debugger;
                SSRIWatcher.refreshInformation();
            }
        };
        SSRIWatcher.utente = new Utente(loadUtenteEvent);
    },
    refreshInformation: function() {
        if (SSRIWatcher.utente.isOnline()) {
            //SSRIWatcher.createMenu();
            ////creato il menu ripristino i checkbox dalle preferenze

            var numMsg = 0;
            var msg;
            var forumList = SSRIWatcher.getSelectedForum();

            for (var i = 0; i < forumList.length; i++) {
                var forum = forumList[i];
                SSRIWatcher.updateForumItem(forum);
                numMsg += forum.getUnReadMessages();
            }
            var label = document.getElementById('ssriwatcher-label');
            if (label.getAttribute("value") != (numMsg + "")) {
                // notifico la presenza di messaggi solo in caso di variazione
                if (numMsg > 0) {
                    label.setAttribute("value", numMsg);
                    label.setAttribute("collapsed", "false");

                    if (forumList.length == 1) {
                        msg = forum.getName() + " [" + numMsg + "] ";
                        SSRIWatcher.notify(msg, forum.getAddress());
                    } else {
                        msg = "Sono presenti " + numMsg + " messaggi";
                        SSRIWatcher.notify(msg, ForumAddressResolver.getAddress(SSRIWatcher.utente, null));

                    }
                } else {
                    label.setAttribute("value", "");
                    label.setAttribute("collapsed", "true");
                }
            }


        }
        SSRIWatcher.updateCurrentStatus();
    },
    createMenu:function() {
        var menu = document.getElementById("ssriwatcher-menu");
        //rimuovo tutti gli elementi del menu
        var len = menu.children.length;
        for (var x = 0; x < len; x++) {
            if (menu.firstChild.id.indexOf("forum-") == 0) {
                menu.removeChild(menu.firstChild);
            }
        }
        var elenco = SSRIWatcher.forumList.getElenco();
        for (var i = 0; i < elenco.length; i++) {
            var item = SSRIWatcher.createForumItem(SSRIWatcher.forumList[i]);
            menu.insertBefore(item, menu.children[0]);
        }
    },
    createForumItem: function(forum) {
        var item = document.createElement("menuitem");
        item.setAttribute("value", forum.getId());
        item.setAttribute("edizione", forum.getEdizione());
        item.setAttribute("label", forum.getName());
        item.setAttribute("url", forum.getURL());
        if (forum.getColor() != null) {
            item.setAttribute("style", "color:" + forum.getColor());
        }
        item.setAttribute("id", "forum-" + forum.getUId());
        item.setAttribute("oncommand", "SSRIWatcher.selectForum(this)");
        item.setAttribute("type", "checkbox");
        // controllo dalle preferenze se il menu era checkato
        if (SSRIWatcher.preferences.prefHasUserValue(item.id)) {
            item.setAttribute("checked", SSRIWatcher.preferences.getBoolPref(item.id));
        }
        return item;
        //TODO: si dovrebbero aggiungere dei submenu sul menu openforum ognuno per l'elemento selezionato

    },
    createOpenForumItem: function(forum) {
        var menu = document.getElementById("ssriwatcher-open-forum");
        var id = "open-forum-" + forum.getUId();
        if (document.getElementById(id) == null) {
            // Se l'elemento non esiste
            var item = document.createElement("menuitem");
            item.setAttribute("id", id);
            item.setAttribute("label", forum.getName());
            if (forum.getColor() != null) {
                item.setAttribute("style", "color:" + forum.getColor());
            }
            item.setAttribute("oncommand", "SSRIWatcher.openForum('" + forum.getAddress() + "')");
            return item;
        }
        return null;
    },
    getSelectedForum: function() {
        var results = new Array;
        var index = 0;
        var menu = document.getElementById("ssriwatcher-menu");

        var items = menu.children;
        for (var i = 0; i < items.length; i++) {
            if (items[i] != null && items[i].hasAttribute("checked") && items[i].getAttribute("checked") == "true") {
                results[index] = new Forum(SSRIWatcher.utente, items[i].getAttribute("value"), items[i].getAttribute("label"), items[i].getAttribute("edizione"));
                if (items[i].hasAttribute("url"))
                    results[index].setURL(items[i].getAttribute("url"));
                debugger;
                if (items[i].style.color != null)
                    results[index].setColor(items[i].style.color);
                index++;
            }
        }
        return results;
    },
    openForum: function(address) {
        if (address != null) {
            openUILinkIn(address, 'tab');
        } else {
            openUILinkIn(Util.BASE_ADDRESS, 'tab');
        }
    },

    createPopup: function() {
        var submenu = document.getElementById("ssriwatcher-open-forum");
        //rimuovo tutti gli elementi del submenu
        var submenuLen = submenu.children.length;
        for (var z = 0; z < submenuLen; z++) {
            if (submenu.firstChild.id.indexOf("open-forum-") == 0) {
                submenu.removeChild(submenu.firstChild);
            }
        }
        var forums = SSRIWatcher.getSelectedForum();
        for (var i = 0; i < forums.length; i++) {
            var openForumItem = SSRIWatcher.createOpenForumItem(forums[i]);
            if (openForumItem != null) {
                if (submenu.children != null && submenu.children.length > 0) {
                    // se non è il primo elemento lo accodo
                    submenu.insertBefore(openForumItem, submenu.children[0]);
                } else {
                    submenu.appendChild(openForumItem);
                }
            }
        }
        return true;
    },
    about: function() {
        window.openDialog('chrome://ssriwatcher/content/about.xul', '', 'chrome,titlebar,toolbar,centerscreen,dialog=yes');
    },
    options: function() {
        window.openDialog('chrome://ssriwatcher/content/options.xul', '', 'chrome,titlebar,toolbar,centerscreen,dialog=yes');
    },
    notify: function(msg, address) {
        var listener = {
            observe: function(subject, topic, data) {
                if (topic == 'alertclickcallback') {
                    if (address == null) {
                        address = Util.BASE_ADDRESS;
                    }
                    openUILinkIn(address, 'tab');
                }
            }
        };

        Util.showPopup("SSRI Watcher", msg, address, listener);
    },
    updateForumItem: function(forum) {
        if (forum != null && forum.getUId() != null && forum.getUId() != "") {
            var item = document.getElementById("forum-" + forum.getUId());
            if (item != null) {
                item.setAttribute("label", item.getAttribute("label") + "(" + forum.getUnReadMessages() + ")");
            }
        }
    },
    selectForum: function(item) {
        var forums = SSRIWatcher.getSelectedForum();
        if (forums.length > 3 && item.getAttribute("checked") == "true") {
            SSRIWatcher.notify("Hai raggiunto il numero massimo di forum monitorabili", null);
            item.setAttribute("checked", "false");
        } else {
            //TODO: quando è ammessa la selezione del forum bisogna popolare il submenu per l'apertura del forum
            SSRIWatcher.preferences.setBoolPref(item.id, item.getAttribute("checked") == "true");
        }
    },
    ssriWatcherClick: function(event) {
        if (event.button == 0) {
            SSRIWatcher.openForum();
        } else if (event.button == 1) {
            SSRIWatcher.checkNow();
        }
    },
    checkNow: function() {
        SSRIWatcher.loadDOM();
        //        SSRIWatcher.refreshInformation();
        if (!SSRIWatcher.utente.isOnline()) {
            SSRIWatcher.notify("Devi effettuare l'accesso in piattaforma", null);
        }
    },
    updateCurrentStatus: function() {
        //TODO: nell'aggiornamento dello stato se ne dovrebbe contemplare uno "presenti messaggi"
        var panel = document.getElementById('ssriwatcher-panel');
        if (SSRIWatcher.utente.isOnline()) {
            panel.tooltipText = "Loggato come " + SSRIWatcher.utente.getName() + " [" +
                                (SSRIWatcher.utente.isTutor() ? "Tutor" : "Studente") + "]";
            SSRIWatcher.updateImage("universita_on.gif");
        } else {
            panel.tooltipText = "E' necessario autenticarsi in piattaforma";
            SSRIWatcher.updateImage("universita_off.png");
        }
    },
    updateImage: function(imageSrc) {
        var ssriImage = document.getElementById('ssriwatcher-image');
        ssriImage.src = "chrome://ssriwatcher/skin/" + imageSrc;
    },
    logout:function() {
        openUILinkIn(Util.LOGOUT_ADDRESS, 'tab');
    }
};


// Install load handler

window.addEventListener("load", function(e) {
    SSRIWatcher.startup();
}, false);
//window.addEventListener('unload', function(e) { SsriWatcher.shutdown(); }, false);

